#include "Ordenador.h"

void Ordenador::swap(int* a, int* b) {
    int t = *a;
    *a = *b;
    *b = t;
}

void Ordenador::seleccion(int* arreglo, int tamano) {
    for (int j, menor, i = 0; i<tamano; ++i) {
        for (j = menor = i; j<tamano; ++j) {
            if (arreglo[j] < arreglo[menor]) {
                menor = j;
            }
        }
        swap(&menor, &i);
    }
}

void Ordenador::insercion(int* arreglo, int tamano) {
    for (int i=0, posicion, valor; i<tamano; ++i) {
        valor = arreglo[i];
        posicion = i;
        
        while (hueco > 0 && valor < arreglo[posicion-1]) {
            arreglo[posicion] = arreglo[--posicion];
        }
        arreglo[posicion] = valor;
    }
}

void Ordenador::merge(int* arreglo, int inicio, int medio, int fin) {
    int tam_izq = medio - inicio + 1;
    int tam_der = fin - medio;
    int* izq = NULL;
    int* der = NULL;
    int i = 0;
    int j = 0;
    
    for (i=0; i<tam_izq; ++i) {
        izq[i] = arreglo[inicio+i-1];
    }
    for (j=0; j<tam_der; ++j) {
        der[i] = arreglo[medio+j];
    }
    
    izq[tam_izq + 1] = INFINITY;
    der[tam_der + 1] = INFINITY;
    
    i = j = 0;
    for (int k = inicio; k<fin; ++k) {
        if (izq[i] <= der[j]) {
            arreglo[k] = izq[i];
            ++i;
        }
        else {
            arreglo[k] = der[j];
            ++j;
        }
    }
}

void Ordenador::m_sort(int* arreglo, int inicio, int fin) {
    if (inicio < fin) {
        int medio = floor((inicio+fin)/2);
        
        m_sort(arreglo, inicio, medio);
        m_sort(arreglo, medio+1, fin);
        merge(arreglo, inicio, medio, fin);
    }
}

void Ordenador::mergesort(int* arreglo, int tamano) {
    m_sort(arreglo, 0, tamano);
}